#ifndef _SINGLETON_MODE_H_
#define _SINGLETON_MODE_H_

#include <string>
#include <vector>
#include <iostream>
#include <fstream>


using namespace std;

namespace DesignMode{


	typedef enum SingletonType{
		STATIC_SINGLETON = 0,
		TRUE_SINGLETON = 1
	};
	

	class StaticLogger{
	public:
		static const std::string kLogLevelDebug;
		static const std::string kLogLevelInfo;
		static const std::string kLogLevelError;
		static void log(const std::string& in_message, const std::string& in_log_level);
		static void log(const std::vector<std::string>& in_messages, const std::string& in_log_level);
		static void tearDown();
	protected:
		static void Init();
		static const char* const kLogFileName;
		static bool sInitialized;
		static std::ofstream sOutputStream;
	private:
		StaticLogger();
	};


	class TrueLogger{
	public:
		static const std::string kLogLevelDebug;
		static const std::string kLogLevelInfo;
		static const std::string kLogLevelError;
		static TrueLogger& Instance();

		void log(const std::string& in_message, const std::string& in_log_level);
		void log(const std::vector<std::string>& in_messages, const std::string& in_log_level);

	protected:
		static TrueLogger sInstance;
		static const char* const kLogFileName;
		std::ofstream mOutputStream;


	private:
		TrueLogger();
		~TrueLogger();
	};



	class Player{
		
	public:
		virtual std::string getName();

		virtual std::string sendInstantMessage(const std::string& inMessage) const;


	};


	class PlayerProxy : public Player
	{
	public:
		virtual std::string getName();
		virtual std::string sendInstantMessage(const std::string& inMessage) const;
	protected:
	private:
	};


	bool informWinner(const Player* inPlayer);
}
#endif